package com.example.his.api.mis.impl;

import cn.hutool.core.map.MapUtil;
import com.example.his.api.common.PageUtils;
import com.example.his.api.db.dao.RoleDao;
import com.example.his.api.db.pojo.RoleEntity;
import com.example.his.api.exception.HisException;
import com.example.his.api.mis.service.RoleService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
public class RoleServiceImpl implements RoleService {

  @Resource
  private RoleDao roleDao;

  /**
   * 查询所有角色信息
   *
   * @return 包含所有角色信息的列表，每个角色以HashMap形式表示
   */
  @Override
  public ArrayList < HashMap > searchAllRole() {
    // 调用RoleDao的searchAllRole方法查询所有角色信息
    ArrayList < HashMap > list = roleDao.searchAllRole();
    // 返回查询结果
    return list;
  }

  /**
   * 分页查询角色信息
   *
   * @param param 查询参数，包含分页信息（page: 当前页码, length: 每页记录数）及其他查询条件
   * @return PageUtils 分页结果对象，包含分页数据、总记录数、总页数等信息
   */
  @Override
  public PageUtils searchByPage( Map param ) {

    ArrayList < HashMap > list = new ArrayList <>();
    long count = roleDao.searchCount( param );
    if ( count > 0 ) {
      list = roleDao.searchByPage( param );
    }
    int page = MapUtil.getInt( param, "page" );
    int length = MapUtil.getInt( param, "length" );
    PageUtils pageUtils = new PageUtils( list, count, page, length );

    return pageUtils;
  }

  /**
   * @param param
   * @return
   */
  @Override
  public Long searchCount( Map param ) {
    return 0L;
  }

  /**
   * 新增角色信息
   *
   * @param role 角色实体对象，包含角色的基本信息和权限设置
   * @return 受影响的记录行数，通常为1表示插入成功
   */
  @Override
  @Transactional
  public int insert( RoleEntity role ) {

    // 调用RoleDao的insert方法将角色信息插入数据库
    int rows = roleDao.insert( role );

    // 返回插入操作影响的行数
    return rows;
  }

  /**
   * @param id
   * @return
   */
  @Override
  public HashMap searchById( int id ) {
    HashMap map = roleDao.searchById( id );
    return map;
  }

  /**
   * @param id
   * @return
   */
  @Override
  public ArrayList < Integer > searchUserIdByRoleId( int id ) {
    ArrayList < Integer > list = roleDao.searchUserIdByRoleId( id );
    return list;
  }

  /**
   * @param role
   * @return
   */
  @Override
  @Transactional
  public int update( RoleEntity role ) {
    int rows = roleDao.update( role );
    return rows;
  }

  /**
   * @param ids
   * @return
   */
  @Override
  public boolean searchCanDelete( Integer[] ids ) {
    return false;
  }

  /**
   * 根据角色ID数组删除角色信息
   *
   * @param ids 角色ID数组
   * @return 受影响的记录行数
   * @throws HisException 当角色关联用户时抛出异常，提示无法删除
   */
  @Override
  @Transactional
  public int deleteByIds( Integer[] ids ) {

    // 检查角色是否可以删除（即未关联任何用户）
    if ( !roleDao.searchCanDelete( ids ) ) {
      // 如果角色已关联用户，则抛出自定义异常，提示无法删除
      throw new HisException( "无法删除关联用户的角色" );
    }

    // 执行删除操作，调用RoleDao的deleteByIds方法
    int rows = roleDao.deleteByIds( ids );

    // 返回删除操作影响的行数
    return rows;
  }


}
